package com.free.ext.web.spring.paramresolve;

import com.free.ext.web.spring.annoation.PageSearch;
import com.free.utils.GenericSuperclassUtils;
import com.free.utils.JsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.lang.reflect.ParameterizedType;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class PageSearchArgumentResolver implements HandlerMethodArgumentResolver {

    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(PageSearch.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String tokenStr = nativeWebRequest.getParameter(methodParameter.getParameterName());
        if(StringUtils.isEmpty(tokenStr)){
            return null;
        }
        Class<?> parameterType = GenericSuperclassUtils.getActualTypeArgument((ParameterizedType)methodParameter.getNestedGenericParameterType());
        return JsonUtils.unsearlize(tokenStr, JsonUtils.constructParametricType(methodParameter.getParameterType(), methodParameter.getParameterType(), parameterType));
    }
    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
